package org.atlantis.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;

/**
 * 通过内存映射文件来实现JVM进程通信。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">李曦</a><br/>
 *         $Created at: 2012-2-23 下午8:02:16
 */
public class WriteShareMemory {

	// 共享文件的大小
	private static final int SHARE_SIZE = 1024;

	public static void main(String[] args) throws Exception {
		RandomAccessFile shareFile = new RandomAccessFile("F:/share_swap.mm", "rw");
		MappedByteBuffer share = shareFile.getChannel().map(MapMode.READ_WRITE, 0, SHARE_SIZE);
		// 清除文件内容，都以0填充
		for (int i = 0; i < SHARE_SIZE; i++)
			share.put(i, (byte) 0);
		// 从文件的第二个字节开始，依次写入A-Z字母，第一个字节指明了当前操作的位置
		for (int i = 65; i < 91; i++) {
			int index = i - 63;
			int flag = share.get(0);
			if (flag != 0) { // 第一位如果不为0则表示不可写，则循环等待
				i--;
				continue;
			}
			share.put(0, (byte) 1);// 正在写数据，标识第一个字节为1
			share.put(1, (byte) index); // 写数据的位置
			share.put(index, (byte) i); // index位置写入数据
			System.out.println("写入数据：" + (char) i);
			share.put(0, (byte) 2);
			Thread.sleep(500);
		}
	}
}
